const redis = require('../config/redis')
const logger = require('./logger')

class RedisHelper {
  /**
   * 设置缓存
   * @param {string} key 缓存键
   * @param {any} value 缓存值
   * @param {number} expireSeconds 过期时间（秒）
   */
  static async set(key, value, expireSeconds = 3600) {
    try {
      const stringValue = JSON.stringify(value)
      if (expireSeconds > 0) {
        await redis.setex(key, expireSeconds, stringValue)
      } else {
        await redis.set(key, stringValue)
      }
    } catch (error) {
      logger.error('Redis set error:', error)
    }
  }

  /**
   * 获取缓存
   * @param {string} key 缓存键
   * @returns {Promise<any>} 缓存值
   */
  static async get(key) {
    try {
      const value = await redis.get(key)
      return value ? JSON.parse(value) : null
    } catch (error) {
      logger.error('Redis get error:', error)
      return null
    }
  }

  /**
   * 删除缓存
   * @param {string} key 缓存键
   */
  static async del(key) {
    try {
      await redis.del(key)
    } catch (error) {
      logger.error('Redis del error:', error)
    }
  }

  /**
   * 删除匹配的缓存
   * @param {string} pattern 匹配模式
   */
  static async delByPattern(pattern) {
    try {
      const keys = await redis.keys(pattern)
      if (keys.length > 0) {
        await redis.del(...keys)
      }
    } catch (error) {
      logger.error('Redis delByPattern error:', error)
    }
  }

  /**
   * 设置哈希表字段
   * @param {string} key 哈希表名
   * @param {string} field 字段名
   * @param {any} value 字段值
   */
  static async hset(key, field, value) {
    try {
      const stringValue = JSON.stringify(value)
      await redis.hset(key, field, stringValue)
    } catch (error) {
      logger.error('Redis hset error:', error)
    }
  }

  /**
   * 获取哈希表字段
   * @param {string} key 哈希表名
   * @param {string} field 字段名
   * @returns {Promise<any>} 字段值
   */
  static async hget(key, field) {
    try {
      const value = await redis.hget(key, field)
      return value ? JSON.parse(value) : null
    } catch (error) {
      logger.error('Redis hget error:', error)
      return null
    }
  }
}

module.exports = RedisHelper 